package model.matrizes;

import java.util.Arrays;

public class MatrizBidimensional {
        
        public static void transposta(Object[][] matriz) {
            Object[][] copia = copiar(matriz);
            for (int i = 0; i<copia.length; i++) {
                    for (int j = 0; j<copia[0].length; j++) {
                            matriz[j][i] = copia[i][j];
                    }
            }
    } // classe estática
        
        /**
     * Não copia os objetos internos, só a matriz.
     *
     * @param matriz
     * @return
     */
    public static Object[][] copiar(Object[][] matriz) {
            Object[][] copia = new Object[matriz.length][matriz[0].length];
            for (int i = 0; i<matriz.length; i++) {
                    copia[i] = Arrays.copyOf(matriz[i], matriz.length);
            }
            return copia;
    }

        /**
     * Ultima coluna será a primeira, a penultima, a segunda e assim por diante.
     *
     * @param matriz
     */
        public static void espelharColunas(Object[][] matriz) {
            transposta(matriz); // O(nm) -> n é número de linhas e m o de colunas.
            espelharLinhas(matriz); // O(m)
            transposta(matriz); // O(nm)
            // O(m(2n+1)) Poderia ser menos custoso, mas não é necessário otimizar agora.
    }


        /**
     * Ultima linha será a primeira, a penultima, a segunda e assim por diante.
     *
     * @param matriz
     */
        public static void espelharLinhas(Object[][] matriz) {
        Object[][] copia = copiar(matriz);
        int linha_copia = 0;
        for (int i = matriz.length-1; i>=0; i--) {
            linha_copia = matriz.length-1 - i;
            System.arraycopy(copia[linha_copia], 0, matriz[i], 0, matriz[0].length);
        }
        }

        private MatrizBidimensional() {}
        
}